/**
 * 日期时间工具类
 * 提供日期和时间相关的通用操作函数
 */

/**
 * 格式化日期时间为指定格式
 * @param {Date} date - 日期对象
 * @param {string} format - 格式模板，支持的占位符:
 *   YYYY: 四位年份
 *   MM: 两位月份
 *   DD: 两位日期
 *   HH: 两位小时（24小时制）
 *   mm: 两位分钟
 *   ss: 两位秒钟
 * @returns {string} 格式化后的日期时间字符串
 */
function formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date || !(date instanceof Date)) {
    date = new Date();
  }
  
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hours = date.getHours();
  const minutes = date.getMinutes();
  const seconds = date.getSeconds();
  
  // 补零函数
  const padZero = (num) => (num < 10 ? `0${num}` : num);
  
  return format
    .replace('YYYY', year)
    .replace('MM', padZero(month))
    .replace('DD', padZero(day))
    .replace('HH', padZero(hours))
    .replace('mm', padZero(minutes))
    .replace('ss', padZero(seconds));
}

/**
 * 解析时间字符串为分钟数
 * @param {string} timeString - 时间字符串，格式为 "HH:mm"
 * @returns {number} 转换后的分钟数，如果解析失败则返回 0
 */
function parseTimeToMinutes(timeString) {
  if (!timeString || typeof timeString !== 'string') {
    return 0;
  }
  
  try {
    const [hours, minutes] = timeString.split(':').map(Number);
    return hours * 60 + minutes;
  } catch (error) {
    console.error('解析时间字符串失败:', error);
    return 0;
  }
}

/**
 * 将分钟数转换为时间字符串
 * @param {number} minutes - 分钟数
 * @returns {string} 格式为 "HH:mm" 的时间字符串
 */
function minutesToTimeString(minutes) {
  if (typeof minutes !== 'number' || minutes < 0) {
    return '00:00';
  }
  
  const hours = Math.floor(minutes / 60);
  const mins = minutes % 60;
  
  return `${hours < 10 ? '0' + hours : hours}:${mins < 10 ? '0' + mins : mins}`;
}

/**
 * 获取当前时间的分钟数（从午夜开始计算）
 * @returns {number} 当前时间的分钟数
 */
function getCurrentTimeInMinutes() {
  const now = new Date();
  return now.getHours() * 60 + now.getMinutes();
}

/**
 * 检查当前时间是否在指定的时间范围内
 * @param {string} startTime - 开始时间，格式为 "HH:mm"
 * @param {string} endTime - 结束时间，格式为 "HH:mm"
 * @returns {boolean} 如果当前时间在指定范围内，则返回 true
 */
function isTimeInRange(startTime, endTime) {
  const startMinutes = parseTimeToMinutes(startTime);
  const endMinutes = parseTimeToMinutes(endTime);
  const currentMinutes = getCurrentTimeInMinutes();
  
  // 处理跨越午夜的情况
  if (startMinutes <= endMinutes) {
    return currentMinutes >= startMinutes && currentMinutes <= endMinutes;
  } else {
    return currentMinutes >= startMinutes || currentMinutes <= endMinutes;
  }
}

module.exports = {
  formatDateTime,
  parseTimeToMinutes,
  minutesToTimeString,
  getCurrentTimeInMinutes,
  isTimeInRange,
}; 